package day13;

/**
 * 冒泡排序
 */
public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = {12,32,15};

        // 冒泡排序
        // bubbleSort(arr);

        // 选择排序
        // selectSort(arr);

        // 遍历数组
        // printArray(arr);

        // 查找元素
        int i = getIndex(arr, 32);
        System.out.println(i);
    }

    public static void printArray(int[] arr) {
        System.out.print("[");
        for (int i = 0; i < arr.length; i++) {
            if (i == arr.length - 1){
                System.out.print(arr[i]);
            } else {
                System.out.print(arr[i] + ", ");
            }
        }
        System.out.print("]");
    }
    
    // 冒泡排序
    public static void bubbleSort(int[] arr){
        for (int i = 0; i < arr.length -1; i++) {
            for (int j = 0; j < arr.length-1-i; j++) {
                if (arr[j] > arr[j+1]) { // 比较值 交换位置
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }

    // 选择排序
    public static void selectSort(int[] arr){
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = i+1; j < arr.length; j++) {
                if (arr[j] < arr[i]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

    /**
     * 查找元素：
     *      二分查找 数组元素有序（折半查找）
     * @param arr
     * @param value
     * @return
     */
    public static int getIndex(int[] arr, int value){
        int minIndex = 0;
        int maxIndex = arr.length - 1;
        int midIndex = (minIndex+maxIndex) / 2;

        while(value != arr[midIndex]){
            if (value > arr[midIndex]) { // 查找的数字大于中间数
                minIndex = midIndex+1;
            } else if (value < arr[midIndex]) {
                maxIndex = midIndex-1;
            }

            if (maxIndex<minIndex) {
                return -1;
            }

            // 重新计算中间索引值
            midIndex = (minIndex+maxIndex) / 2;
        }

        return midIndex;
    }
}
